/**
 * echarts v4.9.0+ 版本之后移除了 map 数据，如果需要要自己找三方数据或区老版本的 echarts 中找
 * 此脚本用于获取 dataV GeoAtlas 平台区域数据
 * dataV GeoAtlas 平台地址 https://datav.aliyun.com/portal/school/atlas/area_selector
 */

import fs from "node:fs";

// dataV 有两个版本 v2 v3
const apiVersion = {
  v2: "areas_v2",
  v3: "areas_v3",
};

// 中国境内下全部地区的geoJson数据包括省市区以 key value 的方式返回
const locationUrl = `https://geo.datav.aliyun.com/areas_v3/bound/infos.json`;
// 中国境内下全部地区的数据，数组形式，官方从高德取的数据，格式为高德数据
const locationUrlArrType = `https://geo.datav.aliyun.com/areas_v3/bound/all.json`;
// 中国code
const chinaCode = `100000`;
// 台湾
const twCode = `710000`;

function createDir() {
  const dirList = ["./province", "./city", "./country"];
  dirList.forEach((dir) => {
    if (!fs.existsSync(dir)) {
      fs.mkdirSync(dir);
    }
  });
}

function getCodeType(code) {
  if (code.slice(-4) === `0000`) {
    return 1; //省
  } else if (code.slice(-2) === `00`) {
    return 2; //市
  } else {
    return 3; //区
  }
}

async function getData(url) {
  const res = await fetch(url);
  const json = await res.json();
  return JSON.stringify(json);
}

function writeFile(dir, content) {
  fs.writeFileSync(dir, content);
  console.log(`${dir} 写入成功`);
}

async function getGeoJson() {
  try {
    const res = await getData(locationUrl);
    writeFile("location.json", res);
    const allKeys = Object.keys(JSON.parse(res));
    for (const key of allKeys) {
      const type = getCodeType(key);
      // 区县
      if (type === 3) {
        const url = `https://geo.datav.aliyun.com/${apiVersion.v3}/bound/${key}.json`;
        const res = await getData(url);
        writeFile(`./country/${key}.json`, res);
      } else {
        // 中国
        if (key === chinaCode) {
          const url = `https://geo.datav.aliyun.com/${apiVersion.v3}/bound/${chinaCode}_full.json`;
          const res = await getData(url);
          writeFile(`china.json`, res);
        } else {
          // 城市
          if (type === 2) {
            const url = `https://geo.datav.aliyun.com/${apiVersion.v3}/bound/${key}_full.json`;
            const res = await getData(url);
            writeFile(`./city/${key}.json`, res);
          }
          // 省份需要单独处理台湾
          else if (type === 1) {
            let url = ``;
            if (key === twCode) {
              url = `https://geo.datav.aliyun.com/${apiVersion.v3}/bound/${twCode}.json`;
            } else {
              url = `https://geo.datav.aliyun.com/${apiVersion.v3}/bound/${key}_full.json`;
            }
            const res = await getData(url);
            writeFile(`./province/${key}.json`, res);
          }
        }
      }
    }
  } catch (error) {
    console.log("🚀 ~ getGeoJson ~ error:", error);
  }
}

function setup() {
  createDir();
  getGeoJson();
}

setup();
